package com.rzcode.coinex.kernel.dao.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.rzcode.coinex.kernel.domain.Alipay;
import com.rzcode.coinex.kernel.domain.BankInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * CTC订单实体类，用于存储CTC交易的所有相关细节。
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "ctc_order")
public class CtcOrder {

    /**
     * 订单ID，自动生成并唯一标识每一个订单。
     */
    @ApiModelProperty(value = "订单ID", example = "1")
    private Long id;

    /**
     * 订单序列号，唯一标识一个订单，不可为空。
     */
    @ApiModelProperty(value = "订单序列号", example = "20230101123456")
    private String orderSn;

    /**
     * 订单发起用户信息。
     */
    @ApiModelProperty(value = "订单发起用户", required = true)
    private Member member;

    /**
     * 实名信息，用于区分买卖双方。
     */
    @ApiModelProperty(value = "实名信息", example = "张三")
    private String realName;

    /**
     * 承兑商用户ID，仅对买家可见。
     */
    @JsonIgnore
    @ApiModelProperty(value = "承兑商用户ID", hidden = true)
    private Member acceptor;

    /**
     * 交易价格，每单位的货币价值。
     */
    @ApiModelProperty(value = "交易价格", example = "6500.00")
    private BigDecimal price;

    /**
     * 交易总金额。
     */
    @ApiModelProperty(value = "交易金额", example = "6500.00")
    private BigDecimal money;

    /**
     * 交易数量，买入或卖出的数量。
     */
    @ApiModelProperty(value = "交易数量", example = "1.00000000")
    private BigDecimal amount;

    /**
     * 币种单位，例如BTC、ETH等。
     */
    @ApiModelProperty(value = "币种单位", example = "BTC")
    private String unit;

    /**
     * 订单状态，0:未接单，1：已接单，2：已付款，3：已完成，4：已取消。
     */
    @ApiModelProperty(value = "订单状态", allowableValues = "0, 1, 2, 3, 4", example = "0")
    private int status;

    /**
     * 接单/确认时间，用户买入时，确认时间与创建时间一致。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "接单/确认时间", example = "2023-01-01 12:00:00")
    private LocalDateTime confirmTime;

    /**
     * 取消原因，如果订单被取消，则填写取消原因。
     */
    @ApiModelProperty(value = "取消原因", example = "资金不足")
    private String cancelReason;

    /**
     * 订单备注信息。
     */
    @ApiModelProperty(value = "备注", example = "请尽快处理")
    private String remark;

    /**
     * 取消时间，如果订单被取消，则记录取消时间。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "取消时间", example = "2023-01-01 12:00:00")
    private LocalDateTime cancelTime;

    /**
     * 完成时间，交易完成的时间点。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "完成时间", example = "2023-01-01 12:00:00")
    private LocalDateTime payTime;

    /**
     * 完成时间，交易最终完成的时间点。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "最终完成时间", example = "2023-01-01 12:00:00")
    private LocalDateTime completeTime;

    /**
     * 订单类型，0:买入，1:卖出。
     */
    @ApiModelProperty(value = "订单类型", allowableValues = "0, 1", example = "0")
    private int direction = 0;

    /**
     * 付费方式，默认为银行转账。
     */
    @ApiModelProperty(value = "付费方式", allowableValues = "alipay, bank, wechatpay", example = "bank")
    private String payMode = "bank";

    /**
     * 支付宝支付信息。
     */
    @ApiModelProperty(value = "支付宝支付信息")
    private Alipay alipay;

    /**
     * 银行转账信息。
     */
    @ApiModelProperty(value = "银行转账信息")
    private BankInfo bankInfo;

    /**
     * 微信支付信息。
     */
    @ApiModelProperty(value = "微信支付信息")
    private WechatPay wechatPay;

    /**
     * 创建时间，订单创建的时间点。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "创建时间", example = "2023-01-01 12:00:00")
    private LocalDateTime createTime;

    /**
     * 系统当前时间，用于计算订单时效。
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "系统当前时间", example = "2023-01-01 12:00:00")
    private LocalDateTime currentTime;
}
